/**
 * タイムテーブル画面 コントローラ
 */
APP.controller('TimeTableCtrl', function($http, $window, $timeout) {
  
  // thisを保持（Ajax内のthisと混同を防ぐ為）
  var pthis = this;
  
  
  /**
   * 初期処理
   */
  pthis.Initialize = function () {

    // 現在日付を取得
    var nowDate = new Date();
    var nowDateString = nowDate.getFullYear() + "" + ("0"+(nowDate.getMonth() + 1)).slice(-2) + "" + ("0"+nowDate.getDate()).slice(-2);

    // スマホ判定フラグ
    pthis.isSmartPhone = isSmartPhone();

    // 表示用データをクリア
    pthis.datTaikai = [];
    pthis.datTimeTable = [];
    pthis.datShowData = [];
    pthis.datShowDataKyogiList = [];
    pthis.datShowDataSyozoku = [];

    // 画面項目を設定
    pthis.prmAryHiduke = {};
    pthis.prmHizuke   = "";
    pthis.prmShumoku  = "a";
    pthis.prmSeibetsu = "a";

    // 種目別表示切替フラグ(1:タイムテーブル/2:種目別表示)
    pthis.prmKyogibetsu = "1";
    pthis.prmKyogibetsuBtnName = "";
    pthis.prmSyozokubetsuBtnName = "";
    pthis.prmTitle = "";
    pthis.prmKyotibetsuSelect = "";
 
    // Promiseを使用しJSONを並列取得し、表示処理を実施する
    Promise.all([new Promise(function (resolve, reject) {

      //=== 大会情報JSONの取得を行う
      $http({
        method  : AJAX_METHOD_GET,
        url     : './Taikai.json' + '?a=' + START_TIMESTAMP,
      }).then(function successCallback(response) {
        // 大会情報データ
        pthis.datTaikai = response.data;
        resolve();
      }, function errorCallback(response) {
        reject();
      });

    }), new Promise(function (resolve, reject) {

      //=== タイムテーブル画面 一覧JSONの取得を行う
      $http({
        method  : AJAX_METHOD_GET,
        url     : './TimeTable.json' + '?a=' + START_TIMESTAMP,
      }).then(function successCallback(response) {
        // 全タイムテーブルデータ
        pthis.datTimeTable = response.data;
        // 日付コンボボックス用データを取得
        pthis.prmAryHiduke = pthis.datTimeTable["NitteiList"];
        if ( pthis.prmAryHiduke.length > 0 ) {
          pthis.prmHizuke = pthis.prmAryHiduke[0].Key;
          // 日付期間内に現在日付が含まれている場合は初期選択する
          for (var i in pthis.prmAryHiduke) {
            var hiduke = pthis.prmAryHiduke[i];
            if (hiduke.Key == nowDateString) {
              pthis.prmHizuke = nowDateString;
              break;
            }
          }
        }
        resolve();
      }, function errorCallback(response) {
        reject();
      });
      
    }), new Promise(function (resolve, reject) {

      //=== 所属画面 一覧JSONの取得を行う
      $http({
        method  : AJAX_METHOD_GET,
        url     : './Syozoku.json' + '?a=' + START_TIMESTAMP,
      }).then(function successCallback(response) {
        // 所属データ
        pthis.datSyozoku = response.data;
        resolve();
      }, function errorCallback(response) {
        reject();
      });
      
    })]).then(function () {

      // 大会情報が同じ場合、sessionStorageに持つ検索条件を取得する
      if (window.sessionStorage.getItem('TaikaiMeiKikan') == pthis.datTaikai.TaikaiMeiKikan) {
        if ( window.sessionStorage.getItem('prmHizuke') != null ) {
          pthis.prmHizuke = window.sessionStorage.getItem('prmHizuke');
        }
        if ( window.sessionStorage.getItem('prmShumoku') != null ) {
          pthis.prmShumoku = window.sessionStorage.getItem('prmShumoku');
        }
        if ( window.sessionStorage.getItem('prmSeibetsu') != null ) {
          pthis.prmSeibetsu = window.sessionStorage.getItem('prmSeibetsu');
        }
        if ( window.sessionStorage.getItem('prmKyogibetsu') != null ) {
          pthis.prmKyogibetsu = window.sessionStorage.getItem('prmKyogibetsu');
        }
        if ( window.sessionStorage.getItem('prmKyotibetsuSelect') != null ) {
          pthis.prmKyotibetsuSelect = window.sessionStorage.getItem('prmKyotibetsuSelect');
        }
      }

      // 表示処理
      $timeout(function() {
        pthis.Show();
      }, 0);

    }).catch(function () {
      // JSON取得エラー
    });

  };

  /**
   * 表示処理
   */
  pthis.Show = function () {

    // 表示用データをクリア
    pthis.datShowData = [];
    pthis.datShowDataKyogiList = [];
    pthis.datShowDataSyozoku = [];

    // 画面で選択されている条件に従い表示データを設定する
    // 対象日付のデータを取得
    var tmpDatHiduke = pthis.datTimeTable["TimeTableList"][pthis.prmHizuke];
    // 対象日付のデータから、対象種目のデータを取得
    var tmpDatShumoku = tmpDatHiduke["Shumoku_" + pthis.prmShumoku];
    // 対象種目のデータから、対象性別のデータを取得
    var tmpDatSeibetsu = tmpDatShumoku["Seibetsu_" + pthis.prmSeibetsu]["TimeTable"];

    // 対象性別のデータを表示用データに設定
    pthis.datShowData = tmpDatSeibetsu;

    // 種目別表示用に設定する
    var tmpSyumokuBetsuList = pthis.datTimeTable["SyumokuBetsuList"];
    for (var i = 0; i < tmpSyumokuBetsuList.length; i++) {
      if (pthis.prmKyotibetsuSelect == "" || pthis.prmKyotibetsuSelect == tmpSyumokuBetsuList[i].KyogiMei)
      {
        pthis.datShowDataKyogiList.push(tmpSyumokuBetsuList[i]);
      }
    }

    // 種目別表示の表示設定
    if (pthis.prmKyogibetsu == "1") {
      // タイムテーブルを表示
      pthis.prmKyogibetsuBtnName = "競技別表示";
      pthis.prmSyozokubetsuBtnName = "所属別表示";
      pthis.prmTitle = "競技一覧－開始時刻別";
    } else {
      // 種目別表示を表示
      pthis.prmKyogibetsuBtnName = "開始時刻別表示";
      pthis.prmSyozokubetsuBtnName = "所属別表示";
      pthis.prmTitle = "競技一覧－競技別";
    }

    // 所属表示用に設定する
    var tmpSyozokuList = pthis.datSyozoku["SyozokuList"];
    for (var i = 0; i < tmpSyozokuList.length; i++) {
      pthis.datShowDataSyozoku.push(tmpSyozokuList[i]);
    }

    // 絞り込み条件をsessionStorageに保存する
    window.sessionStorage.setItem('TaikaiMeiKikan', pthis.datTaikai.TaikaiMeiKikan);
    window.sessionStorage.setItem('prmHizuke', pthis.prmHizuke);
    window.sessionStorage.setItem('prmShumoku', pthis.prmShumoku);
    window.sessionStorage.setItem('prmSeibetsu', pthis.prmSeibetsu);
    // 種目別表示用をsessionStorageに追加
    window.sessionStorage.setItem('prmKyogibetsu', pthis.prmKyogibetsu);
    window.sessionStorage.setItem('prmKyotibetsuSelect', pthis.prmKyotibetsuSelect);

  };

  /**
   * 表示処理
   */
  pthis.ShowKyogi = function () {

    // 表示用データをクリア
    pthis.datShowDataKyogiList = [];

    // 種目別表示用に設定する
    var tmpSyumokuBetsuList = pthis.datTimeTable["SyumokuBetsuList"];
    for (var i = 0; i < tmpSyumokuBetsuList.length; i++) {
      if (pthis.prmKyotibetsuSelect == "" || pthis.prmKyotibetsuSelect == tmpSyumokuBetsuList[i].KyogiMei)
      {
        pthis.datShowDataKyogiList.push(tmpSyumokuBetsuList[i]);
      }
    }

    // 絞り込み条件をsessionStorageに保存する
    window.sessionStorage.setItem('TaikaiMeiKikan', pthis.datTaikai.TaikaiMeiKikan);
    window.sessionStorage.setItem('prmHizuke', pthis.prmHizuke);
    window.sessionStorage.setItem('prmShumoku', pthis.prmShumoku);
    window.sessionStorage.setItem('prmSeibetsu', pthis.prmSeibetsu);
    // 種目別表示用をsessionStorageに追加
    window.sessionStorage.setItem('prmKyogibetsu', pthis.prmKyogibetsu);
    window.sessionStorage.setItem('prmKyotibetsuSelect', pthis.prmKyotibetsuSelect);

  };

  /**
   * タイムテーブル・種目別表示切替
   */
  pthis.DispChange = function () {

    // タイムテーブルの場合は種目別表示に切り替える
    if (pthis.prmKyogibetsu == "1") {
      // 種目別表示を表示
      pthis.prmKyogibetsu = "2";
      pthis.prmKyogibetsuBtnName = "開始時刻別表示";
      pthis.prmSyozokubetsuBtnName = "所属別表示";
      pthis.prmTitle = "競技一覧－競技別";
    } else {
      // タイムテーブルを表示
      pthis.prmKyogibetsu = "1";
      pthis.prmKyogibetsuBtnName = "競技別表示";
      pthis.prmSyozokubetsuBtnName = "所属別表示";
      pthis.prmTitle = "競技一覧－開始時刻別";
    }

    // 種目別表示用をsessionStorageに追加
    window.sessionStorage.setItem('prmKyogibetsu', pthis.prmKyogibetsu);
    window.sessionStorage.setItem('prmKyotibetsuSelect', pthis.prmKyotibetsuSelect);
    
  };


  /**
   * 所属別表示切替
   */
  pthis.SyozokuDispChange = function () {

    // タイムテーブルの場合は種目別表示に切り替える
    if (pthis.prmKyogibetsu == "1" || pthis.prmKyogibetsu == "2") {
      // 所属別表示を表示
      pthis.prmKyogibetsu = "3";
      pthis.prmKyogibetsuBtnName = "開始時刻別表示";
      pthis.prmSyozokubetsuBtnName = "競技別表示";
      pthis.prmTitle = "所属別一覧";
    }else{
      if (pthis.prmKyogibetsu == "3" || pthis.prmKyogibetsu == "4") {
        // 種目別表示を表示
        pthis.prmKyogibetsu = "2";
        pthis.prmKyogibetsuBtnName = "開始時刻別表示";
        pthis.prmSyozokubetsuBtnName = "所属別表示";
        pthis.prmTitle = "競技一覧－競技別";
      }
    }

    // 種目別表示用をsessionStorageに追加
    window.sessionStorage.setItem('prmKyogibetsu', pthis.prmKyogibetsu);
    window.sessionStorage.setItem('prmKyotibetsuSelect', pthis.prmKyotibetsuSelect);
    
  };



  // 初期処理を実行
  pthis.Initialize();

});
